home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / HSBASIC2.DMS / in.adf / HB2Examples1.3.Lha / Examples / Audio / Audio.bas < prev    next >
Encoding:
BASIC Source File  |  1994-04-14  |  3.7 KB  |  132 lines

  1. ''
  2. '' $Id: Audio.bas,v 1.5 1994/03/16 10:54:43 alex Rel $
  3. ''
  4. '' Simple audio.device example
  5. ''
  6. '' Derived from RKM example (c) Copyright 1992 Commodore-Amiga, Inc.
  7. ''
  8.  
  9. DEFINT A-Z
  10.  
  11. 'REM $INCLUDE Exec.bh
  12. 'REM $INCLUDE Graphics.bh
  13. 'REM $INCLUDE Audio.bc
  14.  
  15. REM $INCLUDE BLib/ExecSupport.bas
  16.  
  17. LIBRARY OPEN "exec.library", LIBRARY_MINIMUM&
  18. LIBRARY OPEN "graphics.library", LIBRARY_MINIMUM&
  19.  
  20. '
  21. 'Ask the system if we are PAL or NTSC and set clock constant accordingly 
  22. '
  23. FUNCTION getAudioClock&
  24.     STATIC GfxBase&, palflag
  25.  
  26.     getAudioClock& = -1&
  27.     palflag = PAL&
  28.     IF PEEKW(LIBRARY("graphics.library") + lib_Version) >= 39 THEN
  29.         'V39 and above have an early-start independent PAL detection method
  30.  
  31.         palflag = REALLY_PAL&
  32.     END IF
  33.     IF PEEKW(LIBRARY("graphics.library") + DisplayFlags) AND palflag THEN
  34.         getAudioClock& = 3546895&    'PAL clock
  35.     ELSE
  36.         getAudioClock& = 3579545&    'NTSC clock
  37.     END IF
  38. END FUNCTION
  39.  
  40. '
  41. 'Set up the audio I/O block for channel allocation
  42. '
  43. SUB allocateAudioChannels(BYVAL audioIO&, BYVAL audioMP&)
  44.     STATIC ioreq&, whichannel&
  45.  
  46.     ioreq& = audioIO& + ioa_Request
  47.  
  48.     POKEL ioreq& + IORequestio_Message + mn_ReplyPort, audioMP&    ' the address of a reply port
  49.     POKEB ioreq& + IORequestio_Message + mn_Node + ln_Pri, 0    ' neutral priority
  50.     POKEW ioreq& + IORequestio_Command, ADCMD_ALLOCATE&        ' allocate the channels
  51.     POKEB ioreq& + IORequestio_Flags, ADIOF_NOWAIT&
  52.  
  53.     POKEW audioIO& + ioa_AllocKey, 0
  54.  
  55.     whichannel& = &h01020408    ' channel allocation
  56.     POKEL audioIO& + ioa_Data, VARPTR(whichannel&)
  57.     POKEL audioIO& + ioa_Length, 4
  58. END SUB
  59.  
  60.  
  61. '
  62. 'Set up audio I/O block to play a sample using CMD_WRITE
  63. '
  64. SUB setupAudioPlay(BYVAL audioIO&, BYVAL audioMP&, _
  65.   BYVAL waveptr&, BYVAL samples&, BYVAL frequency&, BYVAL samcyc&, _
  66.   BYVAL duration&, BYVAL clock&)
  67.     STATIC ioreq&, whichannel&
  68.  
  69.     'The io_Flags are set to ADIOF_PERVOL so we can set the
  70.     'period (speed) and volume with the our sample;
  71.     'ioa_Data points to the sample; ioa_Length gives the length
  72.     'ioa_Cycles tells how many times to repeat the sample
  73.     'If you want to play the sample at a given sampling rate,
  74.     'set ioa_Period = clock/(given sampling rate)
  75.  
  76.     ioreq& = audioIO& + ioa_Request
  77.  
  78.     POKEL ioreq& + IORequestio_Message + mn_ReplyPort, audioMP&    ' the address of a reply port
  79.     POKEW ioreq& + IORequestio_Command, CMD_WRITE&
  80.     POKEB ioreq& + IORequestio_Flags, ADIOF_PERVOL&
  81.  
  82.     POKEL audioIO& + ioa_Data, waveptr&
  83.     POKEL audioIO& + ioa_Length, samples&
  84.  
  85.     POKEW audioIO& + ioa_Period, (clock& * samcyc&) \ (samples& * frequency&)
  86.     POKEW audioIO& + ioa_Volume, 64
  87.     POKEW audioIO& + ioa_Cycles, (frequency& * duration&) \ samcyc&
  88. END SUB
  89.  
  90. SUB main
  91.     STATIC clock&, waveptr&, audioIO&, audioMP&, device&, junk&
  92.  
  93.     clock& = getAudioClock&
  94.     IF clock& <> -1 THEN
  95.         '
  96.         'Create an audio I/O block so we can send commands to the audio device
  97.         '
  98.         audioIO& = AllocMem(IOAudio_sizeof, MEMF_PUBLIC& OR MEMF_CLEAR&)
  99.         IF audioIO& <> 0 THEN
  100.             '
  101.             'Create a reply port so the audio device can reply to our commands
  102.             '
  103.             audioMP& = CreatePort&(NULL&, 0)
  104.             IF audioMP& <> 0 THEN
  105.                 allocateAudioChannels audioIO&,audioMP&
  106.                 device& = OpenDevice&(SADD("audio.device" + CHR$(0)), 0, audioIO&, 0)
  107.                 IF device& = 0 THEN
  108.                     '
  109.                     'Create a very simple audio sample in memory
  110.                     '
  111.                     waveptr& = AllocMem&(2, MEMF_CHIP& OR MEMF_PUBLIC&)
  112.                     IF waveptr& <> 0 THEN
  113.                         POKEB waveptr& + 0, 127
  114.                         POKEB waveptr& + 1, -127
  115.                         setupAudioPlay audioIO&, audioMP&, waveptr&, 2, 440, 1, 3, clock&
  116.                         BeginIO audioIO&
  117.                         junk& = WaitPort(audioMP&)
  118.                         junk& = GetMsg(audioMP&)
  119.                         FreeMem waveptr&, 2
  120.                     END IF
  121.                     CloseDevice audioIO&
  122.                 END IF
  123.                 DeletePort AudioMP&
  124.             END IF
  125.             FreeMem AudioIO&, IOAudio_sizeof
  126.         END IF
  127.     END IF
  128. END SUB
  129.  
  130. main    ' start the main program
  131. END
  132.